const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);
const svgCaptcha = require('svg-captcha'); //验证码插件

//引用session
const session = require("express-session");

// express中是把session信息存储在内存中
// 配置session
app.use(session({
        secret: "swfswfswf", //设置签名秘钥 内容可以任意填写
        cookie: { maxAge: 80 * 1000 }, //设置session的过期时间为80秒,
        resave: true, //强制保存，如果session没有被修改也要重新保存
        saveUninitialized: false //如果原先没有session那么就设置，否则不设置
    }))
    // 参数解析
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
    //设置跨域访问
app.all("*", function(req, res, next) {
    //设置允许跨域的域名，*代表允许任意域名跨域
    res.header("Access-Control-Allow-Origin", "*");
    //允许的header类型
    res.header("Access-Control-Allow-Headers", "content-type");
    //跨域允许的请求方式 
    res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
    if (req.method.toLowerCase() == 'options')
        res.send(200); //让options尝试请求快速结束
    else
        next();
})
const fs = require('fs'); //引入 fs 核心模块
const dbJson = './db.json'; //文件路径

// 获取验证码接口
app.get('/getCodeImg', (req, res) => {
    // 字母验数字证码
    // let codeConfig = {
    //     size: 4,// 验证码长度
    //     ignoreChars: '0o1i', // 验证码字符中排除 0o1i
    //     noise: 5, // 干扰线条的数量
    //     width: 100, //验证码宽度
    //     height: 40, //验证码高度
    //     fontSize: 40,   //字体大小
    //     color: true,    //开启字体颜色
    //     background: '#cc9966',//背景颜色
    //     // charPreset:'abcd123456789', //随机预设字符
    // }
    // let captcha = svgCaptcha.create(codeConfig); //验证码

    // 数学表算式验证码
    let codeConfig = {
        mathMin: 1, //数学表达式的最小值
        mathMax: 20, // 数学表达式的最大值
        mathOperator: '+', // 使用的运算符:+、-或+-(用于随机的+或-)
        noise: 5, // 干扰线条的数量
        width: 100, //验证码宽度
        height: 40, //验证码高度
        fontSize: 40, //字体大小
        color: true, //开启字体颜色
        background: '#cc9966', //背景颜色
    }
    let captcha = svgCaptcha.createMathExpr(codeConfig); //算式验证码
    //captcha.text 验证码的文字码
    //captcha.data 验证码图片的svg数据

    let browserId = req.query.browserId; // 获取浏览器指纹id参数
    fs.readFile(dbJson, function(err, data) {
        if (err) {
            return console.error(err);
        }
        //将二进制的数据转换为字符串
        let str = data.toString();
        let verificationCode = [];
        //将字符串转换为json对象
        if (str) {
            verificationCode = JSON.parse(str);
        }
        let index = verificationCode.findIndex(item => item.browserId === browserId)
        if (index > -1) {
            verificationCode[index].answer = captcha.text
        } else {
            let obj = {
                browserId: browserId,
                answer: captcha.text
            }
            verificationCode.push(obj); //将传来的对象push进数组对象中
        }
        let dataStr = JSON.stringify(verificationCode); //把json对象转换成字符串重新写入json文件中
        fs.writeFile(dbJson, dataStr, function(err) {
            if (err) {
                console.error(err);
            }
        })
    })
    res.json({
        status: 200,
        data: captcha.data
    })
});
app.post('/validationCode', (req, res) => {
    var data = '';
    req.on('data', function(chunk) {
        data += chunk;
    });
    req.on('end', function() {
        data = decodeURI(data);
        var dataObject = JSON.parse(data);
        fs.readFile(dbJson, function(err, data) {
            if (err) {
                return console.error(err);
            }
            let verificationCode = JSON.parse(data.toString()) || [];
            let captcha = verificationCode.filter(item => item.browserId === dataObject.browserId)[0]
            if (dataObject.code === captcha.answer) {
                res.json({
                    status: 200,
                    msg: '验证码正确',
                })
            } else {
                res.json({
                    status: 201,
                    msg: '验证码错误'
                })
            }
        })
    });
});

server.listen(3000, () => {
    console.log("server is up and running on  http://127.0.0.1:3000");
});